package br.com.livro.javapersistence.commons.util;

import org.hibernate.cfg.AnnotationConfiguration;

import br.com.livro.javapersistence.heranca.model.Pessoa;
import br.com.livro.javapersistence.heranca.model.PessoaFisica;
import br.com.livro.javapersistence.heranca.model.PessoaJuridica;
import br.com.livro.javapersistence.heranca.model.Solicitacao;
import br.com.livro.javapersistence.heranca.model.SolicitacaoCliente;
import br.com.livro.javapersistence.heranca.model.SolicitacaoContrato;
import br.com.livro.javapersistence.relacionamentos.model.Categoria;
import br.com.livro.javapersistence.relacionamentos.model.CategoriaItem;
import br.com.livro.javapersistence.relacionamentos.model.Item;
import br.com.livro.javapersistence.relacionamentos.model.Perfil;
import br.com.livro.javapersistence.relacionamentos.model.Preco;
import br.com.livro.javapersistence.relacionamentos.model.Produto;
import br.com.livro.javapersistence.relacionamentos.model.Usuario;
import br.com.others.guj.model.Connection;
import br.com.others.guj.model.Dot;
import br.com.others.guj.model.Link;
import br.com.others.guj.model.LinkPK;

public enum ExecucaoHibernate {

	VARIADA {
		@Override
		public void doAddAnnotatedClass(AnnotationConfiguration configuration) {
			
		}
	},
	CHAVES_COMPOSTAS {
		@Override
		public void doAddAnnotatedClass(AnnotationConfiguration configuration) {
			configuration.addAnnotatedClass(LinkPK.class);
			configuration.addAnnotatedClass(Link.class);
			configuration.addAnnotatedClass(Connection.class);
			configuration.addAnnotatedClass(Dot.class);
		}
	},
	HIERARQUIA {
		@Override
		public void doAddAnnotatedClass(AnnotationConfiguration configuration) {
			configuration.addAnnotatedClass(Pessoa.class);
			configuration.addAnnotatedClass(PessoaFisica.class);
			configuration.addAnnotatedClass(PessoaJuridica.class);
			configuration.addAnnotatedClass(Solicitacao.class);
			configuration.addAnnotatedClass(SolicitacaoCliente.class);
			configuration.addAnnotatedClass(SolicitacaoContrato.class);
		}
	}, 
	RELACIONAMENTO {
		@Override
		public void doAddAnnotatedClass(AnnotationConfiguration configuration) {
			configuration.addAnnotatedClass(Item.class);
			configuration.addAnnotatedClass(Produto.class);
			configuration.addAnnotatedClass(CategoriaItem.class);
			configuration.addAnnotatedClass(Categoria.class);
			configuration.addAnnotatedClass(Usuario.class);
			configuration.addAnnotatedClass(Preco.class);
			configuration.addAnnotatedClass(Perfil.class);
		}
	};

	/**
	 * @param configuration
	 */
	protected abstract void doAddAnnotatedClass(AnnotationConfiguration configuration);

	/**
	 * @param configuration
	 */
	public void addAnnotatedClass(AnnotationConfiguration configuration) {
		if (configuration != null)
			this.doAddAnnotatedClass(configuration);
		else
			throw new IllegalArgumentException("configuration can not be null!");
	}
}
